/**
 * @info    (Deze klasse bevat de bewerkingen van de voorraad van de Kantine simulatie.)
 * @author  (Hanze Instituut voor ICT)
 * @editor  (Stephan Veenstra, Michel Jansma) 
 * @version (2012.10.02)
 */

import java.util.*;

public class CanteenSupply {

    //Instantie variabelen definiëren van het type Hashmap
    private HashMap<String, ArrayList<Article>> supply;
    
    /**
     * Constructor. Het eerste argument is een lijst met artikelnamen,
     * het tweede argument is een lijst met prijzen en het derde argument
     * is een lijst met hoeveelheden. Let op: de dimensies van de drie arrays
     * moeten wel gelijk zijn!
     */
    public CanteenSupply(String[] articleName, double[] price, int[] amount) {
        this.supply = new HashMap<String, ArrayList<Article>>();
        for(int i = 0; i < articleName.length; i++) {
            System.out.println(i);
            ArrayList<Article> articles = new ArrayList<Article>();
            for(int j = 0; j < amount[i]; j++) {
                articles.add(new Article(price[i], articleName[i]));
            }
            this.supply.put(articleName[i], articles);
        }
    }
 
    /*
     * Private methode om de lijst van artikelen te krijgen op basis van de    
     * naam van het artikel. Retourneert null als artikel niet bestaat.
     */
    private ArrayList<Article> getArrayList(String name) {
         return this.supply.get(name); 
    }
 
    /**
     * Private methode om een Artikel van de stapel artikelen af te pakken. 
     * Retourneert null als de stapel leeg is.
     */
    private Article getArticle(ArrayList<Article> list) {
        if (list == null || list.isEmpty()) {
           return null;
        }
        Article article = list.get(0);
        list.remove(0);
        return article;
    }
 
    /**
     * Publieke methode om een artikel via naam van de stapel te pakken.
     * Retouneert null als artikel niet bestaat of niet op voorraad is.
     * @param naam (van artikel)
     * @return artikel (of null)
     */
    public Article getArticle(String name) {
        return this.getArticle(this.getArrayList(name));
    }
    
    /**
     * Methode om de voorraad te printen
     * @auteur Stephan
     */
    public void printAllArticles(){
        System.out.println(this.supply.size());
        Set<String> artikelen = this.supply.keySet();
        
        for(String artikel : artikelen){
            System.out.println(artikel + " : " + this.supply.get(artikel).size());
        }
    }
    
    /**
     * Voeg artikelen toe aan de handvan een gegeven aantal
     */
    public void addArticles(String name, int amount){
        ArrayList<Article> artikelList = getArrayList(name);
        double artikelPrijs = artikelList.get(0).getPrice();
        while(amount != 0){
            artikelList.add(new Article(artikelPrijs, name));
            amount--;
        }
    }
    
    /**
     * Controlleer of het betreffende artikel moet worden bijbesteld.
     */
    public void checkSupply(String name){
        if(getArrayList(name).size() < CanteenSimulation.getMIN()){
            int amountToMax = CanteenSimulation.getMIN() - getArrayList(name).size();
            addArticles(name, amountToMax);
        }
    }
}